package com.malou.client.ventas.modeloprenda;

import com.extjs.gxt.ui.client.Style.HorizontalAlignment;
import com.extjs.gxt.ui.client.binding.FieldBinding;
import com.extjs.gxt.ui.client.binding.FormBinding;
import com.extjs.gxt.ui.client.data.BeanModel;
import com.extjs.gxt.ui.client.event.BaseEvent;
import com.extjs.gxt.ui.client.event.ButtonEvent;
import com.extjs.gxt.ui.client.event.ComponentEvent;
import com.extjs.gxt.ui.client.event.Events;
import com.extjs.gxt.ui.client.event.KeyListener;
import com.extjs.gxt.ui.client.event.Listener;
import com.extjs.gxt.ui.client.event.SelectionChangedEvent;
import com.extjs.gxt.ui.client.event.SelectionChangedListener;
import com.extjs.gxt.ui.client.event.SelectionListener;
import com.extjs.gxt.ui.client.store.ListStore;
import com.extjs.gxt.ui.client.store.StoreEvent;
import com.extjs.gxt.ui.client.store.StoreListener;
import com.extjs.gxt.ui.client.widget.Component;
import com.extjs.gxt.ui.client.widget.ContentPanel;
import com.extjs.gxt.ui.client.widget.Dialog;
import com.extjs.gxt.ui.client.widget.Status;
import com.extjs.gxt.ui.client.widget.button.Button;
import com.extjs.gxt.ui.client.widget.form.ComboBox;
import com.extjs.gxt.ui.client.widget.form.ComboBox.TriggerAction;
import com.extjs.gxt.ui.client.widget.form.FormPanel;
import com.extjs.gxt.ui.client.widget.form.HiddenField;
import com.extjs.gxt.ui.client.widget.form.NumberField;
import com.extjs.gxt.ui.client.widget.form.TextField;
import com.extjs.gxt.ui.client.widget.layout.FitLayout;
import com.extjs.gxt.ui.client.widget.layout.FormData;
import com.extjs.gxt.ui.client.widget.toolbar.FillToolItem;
import com.google.gwt.core.client.GWT;
import com.google.gwt.event.dom.client.KeyCodes;
import com.google.gwt.i18n.client.NumberFormat;
import com.malou.client.MalouConstants;
import com.malou.client.util.ComboboxFieldBinding;
import com.malou.client.util.Utilities;

public class ModeloPrendaDialog extends Dialog {
	private HiddenField<String> id;
	private TextField<String> nombre;
	private TextField<String> codigo;
	private HiddenField<String> codigogenerico;
	private NumberField precioventa;
	private NumberField precioetiqueta;
	private ComboBox<BeanModel> marca;
	private ComboBox<BeanModel> tipo;
	private ComboBox<BeanModel> tela;
	private ComboBox<BeanModel> disenio;	
	private ComboBox<BeanModel> color;
	private ComboBox<BeanModel> talla;

	private Button guardar;
	private Button cancelar;
	public Status status;

	private FormBinding formBindings;
	ModeloPrenda mp;
	private MalouConstants constants = GWT.create(MalouConstants.class);
	private FormPanel panel;
	
	public ModeloPrendaDialog(){
		setLayout(new FitLayout());
		setModal(true);
		setPlain(true);
		setSize(300, 340);
		setClosable(true);
		
		panel = new FormPanel();		
		panel.setBorders(false);
	    panel.setBodyBorder(false);
	    panel.setPadding(5);
	    panel.setHeaderVisible(false);
	    panel.setLabelWidth(110);
	    
	    formBindings = new FormBinding(panel, false);	    
	    addFields(panel);
	    
	    setButtonAlign(HorizontalAlignment.LEFT);
	    setButtons("");
	    add(panel);
	    
	    setBodyBorder(true);	    
	    setResizable(false);	    
	    setFocusWidget(marca);
	    
	    Component com[]={marca,tipo,tela,disenio,talla,nombre,precioventa,precioetiqueta,guardar};
	    Utilities.Enter(com);
	}
	
	 @Override
	  protected void createButtons() {
	    super.createButtons();
	    
	    if (constants == null) {
	    	constants = GWT.create(MalouConstants.class);
		}
	    
	    status = new Status();
	    status.setBusy(constants.guardando());
	    status.hide();
	    status.setAutoWidth(true);
	    getButtonBar().add(status);
	    
	    getButtonBar().add(new FillToolItem());
	    
	    cancelar = new Button(constants.cancelar());
	    
	    cancelar.addSelectionListener(new SelectionListener<ButtonEvent>() {
	      public void componentSelected(ButtonEvent ce) {
	    	  ModeloPrendaDialog.this.hide();
	      }

	    });

	    guardar = new Button(constants.guardar());
	    
	    guardar.addSelectionListener(new SelectionListener<ButtonEvent>() {
	      public void componentSelected(ButtonEvent ce) {	    	  
	    	  if(panel.isValid()){
	    		status.show();
  		    getButtonBar().disable();
  		    
  			mp = new ModeloPrenda();
  			System.out.println(mp.getId());
  			if(id.getValue() != null)
  				mp.setId(Integer.valueOf(id.getValue()));
  			mp.setNombre(nombre.getValue());
  			mp.setCodigo(codigo.getValue());
  			mp.setCodigogenerico(codigogenerico.getValue());
  			if(Utilities.hasValue(precioventa))
    			mp.setPrecioventa(Double.valueOf(precioventa.getValue().toString()));
  			if(Utilities.hasValue(precioetiqueta))
    			mp.setPrecioetiqueta(Double.valueOf(precioetiqueta.getValue().toString()));
  			if(tipo.getValue().get("id") != null)
            	mp.setTipoprenda_id(Integer.parseInt(tipo.getValue().get("id").toString()));
  			
  			if(marca.getValue() != null)
  				mp.setMarca_id((Integer)marca.getValue().get("id"));  			
  			if(tela.getValue() != null)
  				mp.setTela_id((Integer)tela.getValue().get("id"));
  			if(disenio.getValue() != null)
  				mp.setDisenio_id((Integer)disenio.getValue().get("id"));
  			if(color.getValue() != null)
  				mp.setColor_id((Integer)color.getValue().get("id"));
  			if(talla.getValue() != null)
  				mp.setTalla_id((Integer)talla.getValue().get("id"));
  			
  			ModeloPrendas.modeloPrendaDialog = ModeloPrendaDialog.this;   			
  			ModeloPrendas.save(mp);	    			
	    	}	    		 
	    	  
	      }
	    });
	    
	    addButton(guardar);
	    addButton(cancelar);	  
	   
	    
	  }	 
	 
	 public void reset(){
		  setIconStyle("icon-new");
		  setHeading(constants.modeloPrendaNuevo());
		  		  
		  id.clear();
		  nombre.clear();
		  codigo.clear();
		  codigogenerico.clear();
		  precioventa.clear();
		  precioetiqueta.clear();
		  marca.clear();
		  tipo.clear();
		  disenio.clear();
		  color.clear();
		  tela.clear();
		  talla.clear();
		  
		  status.hide();
		  getButtonBar().enable();
	  }
	 
	 public void setStore(ListStore<BeanModel> store){
		  //fieldBinding(campo caja de texto,campo de la clase)
		   //id, apellidos, nombres, direccion, ruc, telefono, celular, email,
		    //razonsocial, dni
		  formBindings.addFieldBinding(new FieldBinding(id, "id"));
		  formBindings.addFieldBinding(new FieldBinding(nombre, "nombre"));
		  formBindings.addFieldBinding(new FieldBinding(codigo, "codigo"));
		  formBindings.addFieldBinding(new FieldBinding(codigogenerico, "codigogenerico"));
		  formBindings.addFieldBinding(new FieldBinding(precioventa, "precioventa"));
		  formBindings.addFieldBinding(new FieldBinding(precioetiqueta, "precioetiqueta"));
		  formBindings.addFieldBinding(new ComboboxFieldBinding(tipo, "tipoprenda"));
		  formBindings.addFieldBinding(new ComboboxFieldBinding(marca, "marca"));
		  formBindings.addFieldBinding(new ComboboxFieldBinding(tela, "tela"));
		  formBindings.addFieldBinding(new ComboboxFieldBinding(disenio, "disenio"));
		  formBindings.addFieldBinding(new ComboboxFieldBinding(color, "color"));
		  formBindings.addFieldBinding(new ComboboxFieldBinding(talla, "talla"));
		  formBindings.setStore(store);
	  }
	 
	 private void addFields(ContentPanel cp) {

			id = new HiddenField<String>();
			id.setVisible(false);
			cp.add(id);
			
			SelectionChangedListener<BeanModel> calcularcodigo = new SelectionChangedListener<BeanModel>() {
				
				@Override
				public void selectionChanged(SelectionChangedEvent<BeanModel> se) {
					setCodigo();					
				}
			};
			
			ModeloPrendas.getComboMarcas();
			ModeloPrendas.loaderMarca.load();
			
			
			marca = new ComboBox<BeanModel>();  
			marca.setFieldLabel(constants.modeloPrendaMarca());
			marca.setEmptyText("Seleccione...");
			marca.setDisplayField("descripcion");
			marca.setStore(ModeloPrendas.storeMarca);  
			marca.setTypeAhead(true);  
			marca.setTriggerAction(TriggerAction.ALL);
			marca.setValueField("descripcion");
			marca.setAllowBlank(false);
			marca.setForceSelection(true);
			marca.setUseQueryCache(false);
			marca.setMinChars(0);
		    cp.add(marca, new FormData("-20"));	 
		    
		    marca.getStore().addStoreListener(new StoreListener<BeanModel>(){
		    	public void storeDataChanged(StoreEvent<BeanModel> se){		    		
		    		marca.getStore().filter("descripcion", marca.getRawValue());
		    	}
		    });
	
		    marca.addSelectionChangedListener(calcularcodigo);
			
			ModeloPrendas.getComboTipoPrendasMP();			
			ModeloPrendas.loaderTipoPrenda.load();
		    
		    tipo = new ComboBox<BeanModel>(); 
		    
			tipo.setFieldLabel(constants.modeloPrendaTipo());
			tipo.setDisplayField("nombre");
			tipo.setEmptyText("Seleccione...");
			tipo.setWidth(150);  
			tipo.setStore(ModeloPrendas.storeTipoPrenda);  
			tipo.setTypeAhead(true);  
			tipo.setTriggerAction(TriggerAction.ALL);
			tipo.setValueField("nombre");
			tipo.setAllowBlank(false);
			tipo.setUseQueryCache(false);
			tipo.setMinChars(0);
		    cp.add(tipo, new FormData("-20"));
		    
		    tipo.getStore().addStoreListener(new StoreListener<BeanModel>(){
		    	public void storeDataChanged(StoreEvent<BeanModel> se){		    		
		    		tipo.getStore().filter("nombre", tipo.getRawValue());
		    	}
		    });
		    tipo.addKeyListener(new KeyListener(){
		    	public void componentKeyDown(ComponentEvent event){
		    		if(event.getKeyCode() == KeyCodes.KEY_ENTER){
		    		
		    		}
		    	}
		    });
		    
		    tipo.addSelectionChangedListener(calcularcodigo);
		    
		    ModeloPrendas.getComboTelasMP();
			ModeloPrendas.loaderTela.load();
		    
		    tela = new ComboBox<BeanModel>();  
		    tela.setFieldLabel(constants.modeloPrendaTela());
		    tela.setDisplayField("descripcion");
		    tela.setEmptyText("Seleccione...");
		    tela.setWidth(150);  
		    tela.setStore(ModeloPrendas.storeTela);  
		    tela.setTypeAhead(true);  
		    tela.setTriggerAction(TriggerAction.ALL);
		    tela.setValueField("descripcion");
		    tela.setAllowBlank(false);
		    tela.setUseQueryCache(false);
		    tela.setMinChars(0);
		    cp.add(tela, new FormData("-20"));
		    
		    tela.getStore().addStoreListener(new StoreListener<BeanModel>(){
		    	public void storeDataChanged(StoreEvent<BeanModel> se){		    		
		    		tela.getStore().filter("descripcion", tela.getRawValue());
		    	}
		    });
		    
		    tela.addSelectionChangedListener(calcularcodigo);
		    
		    ModeloPrendas.getComboDiseniosMP();
			ModeloPrendas.loaderDisenio.load();
		    
		    disenio = new ComboBox<BeanModel>();  
		    disenio.setFieldLabel(constants.modeloPrendaDisenio());
		    disenio.setDisplayField("descripcion");
		    disenio.setEmptyText("Seleccione...");
		    disenio.setWidth(150);  
		    disenio.setStore(ModeloPrendas.storeDisenio);  
		    disenio.setTypeAhead(true);  
		    disenio.setTriggerAction(TriggerAction.ALL);
		    disenio.setValueField("descripcion");
		    disenio.setAllowBlank(false);
		    disenio.setUseQueryCache(false);
		    disenio.setMinChars(0);
		    cp.add(disenio, new FormData("-20"));
		    
		    disenio.getStore().addStoreListener(new StoreListener<BeanModel>(){
		    	public void storeDataChanged(StoreEvent<BeanModel> se){		    		
		    		disenio.getStore().filter("descripcion", disenio.getRawValue());
		    	}
		    });
		    
		    disenio.addSelectionChangedListener(calcularcodigo);
		    
		    ModeloPrendas.getComboColoresMP();
			ModeloPrendas.loaderColor.load();
		    
		    color = new ComboBox<BeanModel>( );  
		    color.setFieldLabel(constants.modeloPrendaColor());
		    color.setDisplayField("descripcion");
		    color.setEmptyText("Seleccione...");
		    color.setStore(ModeloPrendas.storeColor);  
		    color.setTypeAhead(true);  
		    color.setTriggerAction(TriggerAction.ALL);
	        color.setValueField("descripcion");
		    color.setAllowBlank(false);
		    color.setUseQueryCache(false);
		    color.setMinChars(0);
		    cp.add(color, new FormData("-20"));
		    
		    color.getStore().addStoreListener(new StoreListener<BeanModel>(){
		    	public void storeDataChanged(StoreEvent<BeanModel> se){
		    	    color.getStore().filter("descripcion",color.getRawValue().toLowerCase());
		    	}
		    });
		    
		    color.addListener(Events.Expand, new Listener<BaseEvent>() {
				@Override
				public void handleEvent(BaseEvent be) {
					color.clearSelections();
				}
			});
		    
		    color.addSelectionChangedListener(calcularcodigo);
		    
		    ModeloPrendas.getComboTallasMP();
			ModeloPrendas.loaderTalla.load();
		    
		    talla = new ComboBox<BeanModel>();  
		    talla.setFieldLabel(constants.modeloPrendaTalla());
		    talla.setDisplayField("descripcion");
		    talla.setEmptyText("Seleccione...");
		    talla.setWidth(150);  
		    talla.setStore(ModeloPrendas.storeTalla);  
		    talla.setTypeAhead(true);  
		    talla.setTriggerAction(TriggerAction.ALL);
		    talla.setValueField("descripcion");
		    talla.setAllowBlank(false);
		    talla.setUseQueryCache(false);
		    talla.setMinChars(0);
		    cp.add(talla, new FormData("-20"));
		    
		    talla.getStore().addStoreListener(new StoreListener<BeanModel>(){
		    	public void storeDataChanged(StoreEvent<BeanModel> se){
		    		talla.getStore().filter("descripcion",talla.getRawValue());
		    	}
		    });
		    
		    talla.addSelectionChangedListener(calcularcodigo);
			
			codigo = new TextField<String>();			
			codigo.setFieldLabel(constants.modeloPrendaCodigo());			
			codigo.setReadOnly(true);
		    cp.add(codigo, new FormData("-20"));
		    
		    codigogenerico = new HiddenField<String>();
		    cp.add(codigogenerico, new FormData("-20"));
		    
		    nombre = new TextField<String>();
		    nombre.setMinLength(3);
		    nombre.setFieldLabel(constants.modeloPrendaNombre());	    
		    nombre.setAllowBlank(false);	    
		    cp.add(nombre, new FormData("-20"));
		    
		    precioventa = new NumberField();		    
		    precioventa.setMinLength(2);
		    precioventa.setFieldLabel(constants.modeloPrendaPrecioVenta());	    
		    precioventa.setAllowBlank(false);		    
		    precioventa.setFormat(NumberFormat.getFormat("0.00"));
		    precioventa.setAllowNegative(false);
		    cp.add(precioventa, new FormData("-20"));
		    
		    precioetiqueta = new NumberField();		    
		    precioetiqueta.setMinLength(2);
		    precioetiqueta.setFieldLabel(constants.modeloPrendaPrecioEtiqueta());	    
		    precioetiqueta.setAllowBlank(false);		    
		    precioetiqueta.setFormat(NumberFormat.getFormat("0.00"));
		    precioetiqueta.setAllowNegative(false);
		    cp.add(precioetiqueta, new FormData("-20"));
 
	   }
	 
	 public void beforeEdit(){
		  setIconStyle("icon-update");
		  setHeading(constants.modeloPrendaModificar());		  
		  
		  status.hide();
		  getButtonBar().enable();		  
	  }
	  public void bind(BeanModel selectedModel){		  
		  formBindings.bind(selectedModel);
	  }
	  public void unbind(){
		  formBindings.unbind();
	  }
	  
	  private void setCodigo(){	 

		 String mar = (marca.getValue() != null) ? (String)marca.getValue().get("codigo") : "";
		 String tpr = (tipo.getValue() != null) ? (String)tipo.getValue().get("codigo") : "";
		 String tel = (tela.getValue() != null) ? (String)tela.getValue().get("codigo") : "";
		 String dis = (disenio.getValue() != null) ? (String)disenio.getValue().get("codigo") : "";
		 String col = (color.getValue() != null) ? (String)color.getValue().get("codigo") : "";
		 String tal = (talla.getValue() != null) ? (String)talla.getValue().get("descripcion") : "";
			 
		 codigo.setValue(mar+tpr+tel+dis+col+tal);
		 codigogenerico.setValue(mar+tpr+tel);

	  }
	  

}
